////////////////////////////////////////////////////////////////////////////////
// Copyright (C) 2008 Michiel Helvensteijn                                    //
//                                                                            //
// This file is part of the Mist compiler.                                    //
//                                                                            //
// The Mist compiler is free software: you can redistribute it and/or modif   //
// it under the terms of the GNU General Public License as published by       //
// the Free Software Foundation, either version 3 of the License, or          //
// (at your option) any later version.                                        //
//                                                                            //
// The Mist compiler is distributed in the hope that it will be useful,       //
// but WITHOUT ANY WARRANTY; without even the implied warranty of             //
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the              //
// GNU General Public License for more details.                               //
//                                                                            //
// You should have received a copy of the GNU General Public License          //
// along with the Mist compiler.  If not, see <http://www.gnu.org/licenses/>. //
////////////////////////////////////////////////////////////////////////////////

#include "ast/identifier.hpp"

/******************************************************************************
 * Includes                                                                   *
 ******************************************************************************/

#include <boost/shared_ptr.hpp>
using boost::dynamic_pointer_cast;

#include "assert.hpp"

/******************************************************************************
 * Function Implementations                                                   *
 ******************************************************************************/

shared_ptr<Identifier> Identifier::create(const string& name) {
	return shared_ptr<Identifier>(new Identifier(name));
}

Identifier::Identifier(const string& text) : _text(text) {
	assert(!text.empty());
}

bool Identifier::equals(shared_ptr<Node> other) {
	return typeid(*other) == typeid(Identifier)
	    && text() == dynamic_pointer_cast<Identifier>(other)->text();
}

void Identifier::set_symbol(shared_ptr<NamedSymbol> symbol) {
	assert(symbol);
	
	_symbol = symbol;
}

shared_ptr<NamedSymbol> Identifier::symbol() {
	assert(_symbol);
	
	return _symbol;
}

bool Identifier::symbol_is_set() const {
	return (bool)_symbol;
}
